跳到主要内容

K3s 使用 drone 搭建 CICD

绑定 GitHub 仓库

登录 GitHub,在 https://github.com/settings/applications/new (opens new window)新建一个应用。

接下来查看这个应用的详情,记录 Client ID 和 Client Secret,之后配置 Drone 会用到

安装 drone

# 添加 Drone 的 Helm 仓库
helm repo add drone https://charts.drone.io
helm repo update

# 安装 Drone
helm install --namespace drone --create-namespace --wait drone drone/drone \
--set env.DRONE_SERVER_HOST=your-drone-server-host \
--set env.DRONE_SERVER_PROTO=http \
--set env.DRONE_GITHUB_CLIENT_ID=your-github-client-id \
--set env.DRONE_GITHUB_CLIENT_SECRET=your-github-client-secret \
--set env.DRONE_RPC_SECRET=your-secret-key

# 使用命名空间访问公共的代理 Pod

注意!!! 国内的这个网络,不挂代理是基本无法访问 Github 的,所以这里还需要加上代理

如果要卸载的话

helm uninstall drone --namespace drone

使用 Helm 安装的 Drone 的配置可以通过修改 Helm 的 values 文件来进行更新。以下是修改 Drone 配置的一般步骤:

从当前运行中的 Drone Helm release 中导出配置。

helm list
helm get values drone --namespace drone > drone-values.yaml

然后修改了 drone-values.yaml 文件后,使用 helm upgrade 命令来更新 Drone:

helm upgrade drone drone/drone --namespace drone -f drone-values.yaml
# drone-values.yaml
# ...
env:
HTTP_PROXY: "http://v2ray-proxy-service.common-namespace.svc.cluster.local:1081"
HTTPS_PROXY: "http://v2ray-proxy-service.common-namespace.svc.cluster.local:1081"
NO_PROXY: ".your-internal-domain.com,localhost,127.0.0.1"

自定义模板

如果需要自定义模板,使用 Helm 自带的 pull 命令来下载 Chart 包,并使用tar命令解压它:

helm pull drone/drone
tar -zxvf drone-0.6.5.tgz

修改完成后,你可以选择将Helm Chart打包回.tgz格式:

helm package path/to/your/chart -d path/to/destination

安装或升级Helm Chart

helm install release-name path/to/your/chart
# 或者
helm upgrade release-name path/to/your/chart

绑定 Gogs 仓库

helm install --namespace drone --create-namespace --wait drone drone/drone \
--set env.DRONE_SERVER_HOST=your-drone-server-host \
--set env.DRONE_SERVER_PROTO=http \
--set env.DRONE_GOGS_SERVER=https://gogs.quicktoolset.top \
--set env.DRONE_RPC_SECRET=your-secret-key

# 或者指定 value 文件安装
helm install drone -f path/to/your/values.yaml drone/drone --namespace drone
  1. 登录 drone 激活仓库
  2. 在仓库创建 .drone.yml 文件
  3. 检查仓库的 webhooks 配置是否正常

激活之后,自动就会在 gogs 仓库的 Web 设置中创建钩子 当不存在 .drone.yml 文件或者仓库没有在 drone 激活,测试返回的报文可能是 dial tcp 连接失败。

配置构建机器

创建一个配置文件 drone-runner-values.yaml:

service:
type: LoadBalancer

env:
DRONE_RPC_PROTO: http
DRONE_RPC_HOST: drone:8080
DRONE_RPC_SECRET: your-secret-key # 与 Drone Server 中的 DRONE_RPC_SECRET 一致

使用 Helm 安装 Drone Runner:

helm install drone-runner drone/drone-runner-kube -f drone-runner-values.yaml --namespace drone

# 更新
helm upgrade drone-runner drone/drone-runner-kube -f drone-runner-values.yaml --namespace drone

配置 Drone Pipeline

在你的 GitHub 仓库中创建一个 .drone.yml 文件,定义你的 CI/CD pipeline。

Drone 配置项

这里列了一些常用的配置项,更多配置项请参考 Drone 官方文档 (opens new window)。

kind: pipeline  # 定义这是一个pipeline
type: docker # 或者 kubernetes, exec
name: default # pipeline的名字

steps: # 定义执行的步骤
- name: build # 步骤的名字
image: golang:1.15 # 使用的docker镜像
commands: # 执行的命令
- go build
- go test

- name: docker # 步骤的名字
image: plugins/docker # 使用的docker插件,用于构建和推送docker镜像
settings: # 插件的配置
username: your-dockerhub-username # Docker Hub 用户名
password: your-dockerhub-password # Docker Hub 密码或访问令牌
repo: your-dockerhub-username/your-repo # Docker 镜像的仓库名
tags: latest # 镜像的标签

- name: notify # 步骤的名字
image: plugins/slack # 使用的slack通知插件
settings: # 插件的配置
channel: general # Slack 频道
webhook: your-slack-webhook-url # Slack 的 Webhook URL

services: # 定义服务(如数据库等),这些服务在整个pipeline运行期间可用
- name: database # 服务的名字
image: postgres # 使用的docker镜像
environment: # 环境变量
POSTGRES_DB: test # 数据库名
POSTGRES_USER: user # 数据库用户名
POSTGRES_PASSWORD: password # 数据库密码

trigger: # 定义触发pipeline的条件
branch: # 定义哪些分支会触发pipeline
- master # master分支会触发
- feature/* # 所有以"feature/"开头的分支会触发

depends_on: # 定义pipeline的依赖关系,即当前pipeline依赖哪些其他pipeline
- other-pipeline # 依赖名为"other-pipeline"的pipeline

volumes: # 定义卷,用于在步骤之间共享数据
- name: cache # 卷的名字
host: # 宿主机卷类型
path: /var/lib/drone/cache # 卷在宿主机上的路径

---
kind: secret # 定义这是一个secret
type: docker # 定义secret的类型,这里是docker
name: docker_username # secret的名字
get:
path: org/repo
name: docker_username # secret在密钥管理系统中的名字

跑流水线无法运行,提示 Pending

检查 Runner 日志,是否成功连接 Server 检查 Server 数据库文件是否成功创建 检查 .drone.yml 配置参数是否正确,type 是否与 Runner type 一致 关于 Pending,可以看下官方的一篇帖子:Builds are Stuck in Pending Status。

配置自签 CA 到镜像里面

USER-SUPPLIED VALUES:
env:
DRONE_SERVER_HOST: drone.quicktoolset.top
DRONE_SERVER_PROTO: https
DRONE_RPC_SECRET: xxxxxxxxx
NO_PROXY: "drone.quicktoolset.top,localhost,127.0.0.1"
DRONE_GOGS_SERVER: https://gogs.quicktoolset.top
DRONE_GOGS_SKIP_VERIFY: true
DRONE_TRACE: true # 打开调试日志
extraVolumes:
- name: custom-certs
secret:
secretName: internal-ca-key-pair
items:
- key: tls.crt
path: tls.crt

extraVolumeMounts:
- name: custom-certs
mountPath: /etc/ssl/certs/tls.crt
subPath: tls.crt
readOnly: true

再更新一下

# 更新
helm upgrade drone-runner drone/drone-runner-kube -f drone-runner-values.yaml --namespace drone

然后还需要给构建机器添加一个环境变量

DRONE_RUNNER_VOLUMES=/etc/ssl/certs/ca-certificates.crt:/etc/ssl/certs/ca-certificates.crt

References